/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Salem_NotePad;
import java.awt.Color;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.*;
/**
 *
 * @author Ahmed El-Sayed Salem
 */
public class ParenMatcher extends JTextPane implements Runnable{
        

public static Color[] matchColor = { Color.blue, Color.magenta, Color.green };
  public static Color badColor = Color.red;

  private AttributeSet[] matchAttrSet;
  private AttributeSet badAttrSet;

  public ParenMatcher() {
 
    StyleContext sc = StyleContext.getDefaultStyleContext();
    badAttrSet = sc.addAttribute(SimpleAttributeSet.EMPTY,StyleConstants.Foreground, badColor);
                          
    matchAttrSet = new AttributeSet[matchColor.length];
    for (int j=0; j < matchColor.length; j+=1)
      matchAttrSet[j] = sc.addAttribute(SimpleAttributeSet.EMPTY,StyleConstants.Foreground, matchColor[j]);
                                 
  }
  
  // match and color the parens/brackets/braces
  public void run() {
    StyledDocument doc = getStyledDocument();
    String text = "";
    int len = doc.getLength();
    try {
      text = doc.getText(0, len);
    } catch (BadLocationException ble) { }
    java.util.Stack stack = new java.util.Stack();
    for (int j=0; j < text.length(); j+=1) {
      char ch = text.charAt(j);
      if (ch == '(' || ch == '[' || ch == '{') {
        int depth = stack.size();
        stack.push(""+ch+j); // push a String containg the char and the offset
        AttributeSet aset = matchAttrSet[depth % matchAttrSet.length];
        doc.setCharacterAttributes(j, 1, aset, false);
      }
      if (ch == ')' || ch == ']' || ch == '}') {
        String peek = stack.empty() ? "." : (String)stack.peek();
        if (matches(peek.charAt(0), ch)) { // does it match?
          stack.pop();
          int depth = stack.size();
          AttributeSet aset = matchAttrSet[depth % matchAttrSet.length];
          doc.setCharacterAttributes(j, 1, aset, false);
        }
        else { // mismatch
          doc.setCharacterAttributes(j, 1, badAttrSet, false);
        }
      }
     }
     
     while (! stack.empty()) { // anything left in the stack is a mismatch
       String pop = (String)stack.pop();
       int offset = Integer.parseInt(pop.substring(1));
       doc.setCharacterAttributes(offset, 1, badAttrSet, false);
     }
  }

  // unset the foreground color (if any) whenever the user enters text
  // (if not for this, text entered after a paren would catch the paren's color)
  public void replaceSelection(String content) {
    getInputAttributes().removeAttribute(StyleConstants.Foreground);
    super.replaceSelection(content);
  }

  // return true if 'left' and 'right' are matching parens/brackets/braces
  public static boolean matches(char left, char right) {
    if (left == '(') return (right == ')');
    if (left == '[') return (right == ']');
    if (left == '{') return (right == '}');
    return false;
  }
 public void Selected_color(Color c,String s) { // better implementation--uses StyleContext
    StyleContext sc = StyleContext.getDefaultStyleContext();
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY,StyleConstants.Foreground, c);
 
    setCharacterAttributes(aset, false);
    replaceSelection(s); 
  }
       public void italic(JTextPane text){
   StyledDocument doc=text.getStyledDocument();

Style st=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
Style regular = doc.addStyle("regular", st);
StyleConstants.setItalic(regular,true);
StyleConstants.setFontSize(  regular,Integer.parseInt(SelectFont.Sizelist.getSelectedValue().toString()));
      text.setCharacterAttributes(  doc.getStyle("regular"),true);   
       
      }
       public void bold(JTextPane text){
                StyledDocument doc=text.getStyledDocument();

Style st=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
Style regular = doc.addStyle("regular", st);
StyleConstants.setBold(regular,true);
StyleConstants.setFontSize(  regular,Integer.parseInt(SelectFont.Sizelist.getSelectedValue().toString()));
      text.setCharacterAttributes(  doc.getStyle("regular"),true);   
       
      }//bold
       public void underline(JTextPane text){
       StyledDocument doc=text.getStyledDocument();

Style st=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
Style regular = doc.addStyle("regular", st);
StyleConstants.setUnderline(regular,true);
StyleConstants.setFontSize(  regular,Integer.parseInt(SelectFont.Sizelist.getSelectedValue().toString()));
      text.setCharacterAttributes(  doc.getStyle("regular"),true);   
       
      }//underline
             public void setleft(JTextPane text){
      
          StyledDocument doc=text.getStyledDocument();

        javax.swing.text.Style st=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
        javax.swing.text.Style regular = doc.addStyle("regular", st);
StyleConstants.setAlignment(regular,StyleConstants.ALIGN_LEFT);
StyleConstants.setFontSize(  regular,Integer.parseInt(SelectFont.Sizelist.getSelectedValue().toString()));
      doc.setParagraphAttributes(0,doc.getLength(),doc.getStyle("regular"),true);   

      }//left
               public void setcenter(JTextPane text){
      StyledDocument doc=text.getStyledDocument();

        javax.swing.text.Style st=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
        javax.swing.text.Style regular = doc.addStyle("regular", st);
StyleConstants.setAlignment(regular,StyleConstants.ALIGN_CENTER);
StyleConstants.setFontSize(  regular,Integer.parseInt(SelectFont.Sizelist.getSelectedValue().toString()));
      doc.setParagraphAttributes( 0, doc.getLength(),doc.getStyle("regular"),true);   
 
      }//center
                public void setright(JTextPane text){
      StyledDocument doc=text.getStyledDocument();

        javax.swing.text.Style st=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
        javax.swing.text.Style regular = doc.addStyle("regular", st);
StyleConstants.setAlignment(regular,StyleConstants.ALIGN_RIGHT);
StyleConstants.setFontSize(  regular,Integer.parseInt(SelectFont.Sizelist.getSelectedValue().toString()));
doc.setParagraphAttributes(0,doc.getLength(),  doc.getStyle("regular"),true);   
 
      }//right
                
    public void color(JTextPane text){    
   StyledDocument doc=text.getStyledDocument();

Style st=StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
Style regular = doc.addStyle("regular", st);
StyleConstants.setForeground(regular,JColorChooser.showDialog(null,"chose color",Color.BLACK));
StyleConstants.setFontSize(  regular,Integer.parseInt(SelectFont.Sizelist.getSelectedValue().toString()));
      text.setCharacterAttributes(  doc.getStyle("regular"),true);   
                 
              
              
              
           repaint();
                      } 
    
 
}
